home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_77 / soundx.prg < prev    next >
Text File  |  1995-01-01  |  5KB  |  160 lines

  1. ****************************************************************************** 
  2. * Program Name: soundx.prg 
  3. * Coded by:     Richard R. Schafer 
  4. *   Produces a code based on the "Soundex" method originally developed 
  5. *       by M.K. Odell and R.C. Russell.  Algorithm can be found on page 
  6. *       392 of Knuths' book 'Sorting and Searching', volume 3 of 'The Art 
  7. *       of Computer Programming", Addison/Wesley publisher. 
  8. *   All non alphabetic characters and numbers are discarded.  Converts input 
  9. *       character string to uppercase and then procedes. 
  10. *   usage:  soundxx(gp_name) 
  11. *   gp_name = input character string on which soundex code is developed 
  12. ******************* RELEASED INTO THE PUBLIC DOMAIN ************************** 
  13.  
  14. FUNCTION soundxx 
  15.  
  16. parameters gp_name 
  17.  
  18. private pv_name_, pv_next, pv_code, pv_newname,pv_winscrn,pv_colorset 
  19. private pv_array,pv_arrayct,NULL 
  20.  
  21. *  this would probably be a global variable under normal usage 
  22. NULL = "" 
  23.  
  24. *  Set up way to get out if we didn't get any parameters, 
  25. *  as well as give the programmer a way to determine if 
  26. *  things went well 
  27. begin sequence 
  28.      *  did we get any parameters? 
  29.      if pcount() < 1 
  30.           set cursor off 
  31.  
  32.           *  save the screen window 
  33.           pv_winscrn = savescreen(08,10,13,69) 
  34.  
  35.           *  save the current screen attribs 
  36.           pv_colorset = setcolor() 
  37.           set color to "n/w,w+/n" 
  38.  
  39.           *  draw a box around the window 
  40.           @08,10 clear to 13,69 
  41.           @08,10 to 13,69 double 
  42.  
  43.           *  wait for user response 
  44.           @09,12 say "Usage:  soundxx(X_name)" 
  45.           @10,12 say "Where X_name is your variable containing the name" 
  46.           @11,12 say "you want a soundex code for" 
  47.           @12,12 say "PRESS ANY KEY TO CONTINUE" 
  48.           inkey(0) 
  49.           set cursor on 
  50.  
  51.           *  reset screen attribs 
  52.           set color to &pv_colorset 
  53.  
  54.           *  restore the screen 
  55.           restscreen(08,10,13,69,pv_winscrn) 
  56.  
  57.           *  return to calling function 
  58.           pv_code = .f. 
  59.  
  60.           *  and then break out of the sequence and return 
  61.           break 
  62.      endif 
  63.  
  64.      *  make sure everything is caps 
  65.      pv_newname = upper(gp_name) 
  66.       
  67.      *  set to the # char in the input character string 
  68.      pv_arrayct = len(rtrim(pv_newname)) 
  69.  
  70.      *  declare an array 
  71.      declare pv_name_[pv_arrayct] 
  72.  
  73.      * initialize a counter 
  74.      pv_array = 1 
  75.  
  76.      *  now we'll prepare the name string 
  77.      for pv_count = 1 to pv_arrayct 
  78.  
  79.           *  we'll eliminate everything that 
  80.           *  isn't an uppercase alpha character 
  81.           if asc(substr(pv_newname,pv_count,1)) < asc("A") .or.; 
  82.                asc(substr(pv_newname,pv_count,1)) > asc("Z") 
  83.           else 
  84.  
  85.                *  put it into our array 
  86.                *  increment the array counter 
  87.                pv_name_[pv_array] = substr(pv_newname,pv_count,1) 
  88.                pv_array = pv_array + 1 
  89.           endif 
  90.  
  91.      next 
  92.  
  93.      *  initialize the code holder 
  94.      pv_code = NULL 
  95.  
  96.      *  set to length of array 
  97.      pv_arrayct = len(pv_name_) 
  98.  
  99.      *  reset array counter 
  100.      pv_array = 1 
  101.  
  102.      *  put the 1st char into the code 
  103.      *  as is (not a number here) 
  104.      pv_code = pv_code + pv_name_[pv_array] 
  105.  
  106.      *  We'll stay in the loop 
  107.      *  until we fill the name string 
  108.      *  or until we hit the end of the array 
  109.      do while (len(pv_code)) < 4 .and. (pv_array < pv_arrayct) 
  110.  
  111.           *  increment array counter 
  112.           pv_array = pv_array + 1 
  113.  
  114.           do case 
  115.  
  116.                *  we skip these characters 
  117.                case pv_name_[pv_array] $ "AEHIOUWY" 
  118.  
  119.                *  and get numbers for the rest 
  120.                case pv_name_[pv_array] $ "BFPV" 
  121.                    pv_code = pv_code + "1" 
  122.                case pv_name_[pv_array] $ "CGJKQSXZ" 
  123.                    pv_code = pv_code + "2" 
  124.                case pv_name_[pv_array] $ "DT" 
  125.                    pv_code = pv_code + "3" 
  126.                case pv_name_[pv_array] $ "L" 
  127.                    pv_code = pv_code + "4" 
  128.                case pv_name_[pv_array] $ "MN" 
  129.                    pv_code = pv_code + "5" 
  130.                case pv_name_[pv_array] $ "R" 
  131.                    pv_code = pv_code + "6" 
  132.           endcase 
  133.  
  134.           * if we haven't gone beyond the end of the array 
  135.           if (pv_array + 1) < pv_arrayct 
  136.  
  137.                * is the next character the same 
  138.                * if it is, we'll skip it and 
  139.                * use the following character 
  140.                if pv_name_[pv_array] == pv_name_[pv_array + 1] 
  141.                    pv_array = pv_array + 1 
  142.                endif 
  143.  
  144.           endif 
  145.  
  146.      enddo 
  147.  
  148.      *  if the code isn't 4 characters long 
  149.      *  pad it with zeroes 
  150.      if len(pv_code) < 4 
  151.           pv_code = pv_code + replicate("0",4 - (len(pv_code))) 
  152.      endif 
  153. end sequence 
  154. return(pv_code) 
  155.